import logging

from sqlalchemy import Engine
from sqlmodel import Session, select
from tenacity import after_log, before_log, retry, stop_after_attempt, wait_fixed

from app.core.db import engine

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

max_tries = 60 * 5  # 5 minutes
wait_seconds = 1


@retry(
    stop=stop_after_attempt(max_tries),
    wait=wait_fixed(wait_seconds),
    before=before_log(logger, logging.INFO),
    after=after_log(logger, logging.WARN),
)
def init(db_engine: Engine) -> None:
    """
    数据库初始化模块。
    
    该模块包含用于初始化数据库连接的工具函数，确保数据库在服务启动时可用。
    
    全局变量:
        max_tries (int): 最大重试次数，默认为 5 分钟（60 * 5）。
        wait_seconds (int): 每次重试之间的等待时间，默认为 1 秒。
        logger (Logger): 日志记录器实例，用于记录初始化过程中的信息。
    
    函数:
        init(db_engine: Engine) -> None:
            初始化数据库连接并验证其可用性。
            使用 `tenacity` 库实现重试逻辑，确保在数据库不可用时自动重试。
            如果最终无法连接，抛出异常。
    
            参数:
                db_engine (Engine): SQLAlchemy 数据库引擎实例。
    
            抛出:
                Exception: 如果数据库连接失败。
    
        main() -> None:
            服务入口函数，调用 `init` 函数初始化数据库并记录服务状态。
    """
    try:
        with Session(db_engine) as session:
            session.exec(select(1))
    except Exception as e:
        logger.error(e)
        raise e


def main() -> None:
    logger.info("Initializing service")
    init(engine)
    logger.info("Service finished initializing")


if __name__ == "__main__":
    main()
